#include "TTokenizer.h"

int comparadorString(void* elem1, void* elem2);

int cargarListaTerminosOmitir(TListaSimpleOrdenada* listaTerminosOmitir){
    int cantidadTerminos;
    char terminoLeido[MAX_DATO];
    FILE* archivoTerminosOmitir = fopen(NOMBRE_ARCHIVO_TERMINOS_OMITIR, "r");
    cantidadTerminos = 0;
    if(archivoTerminosOmitir!=NULL){
        while(fgets(terminoLeido, MAX_DATO, archivoTerminosOmitir)!=NULL){
            /* Puntero usado para eliminar los fines de linea */
            char* punteroEliminarFinLinea = NULL;
            /* Si el termino tiene fin de linea se lo saca */
            punteroEliminarFinLinea=strstr(terminoLeido, STRING_FIN_LINEA);
            if (punteroEliminarFinLinea!=NULL){
                punteroEliminarFinLinea[0]=CARACTER_FIN_CADENA;
            }
            lso_Insertar(listaTerminosOmitir, terminoLeido);
        }
    }
    return cantidadTerminos;
}

int omitirTermino(TTokenizer* tt, char* termino){
    int encontrado = CODIGO_ERROR_NO_PROCESAR_TERMINO;
    if ( !lso_Vacia(tt->listaTerminosOmitir) ){
        int error = lso_MoverCorriente(&tt->listaTerminosOmitir, LS_PRIMERO);
        while(error==0 && encontrado!=0){
            char terminoLista[MAX_DATO];
            lso_ElemCorriente(tt->listaTerminosOmitir, terminoLista);
            if ( strcmp(terminoLista, termino)==0 ){
                encontrado=CODIGO_OK;
            }
            error=lso_MoverCorriente(&tt->listaTerminosOmitir, LS_SIGUIENTE);
        }
    }
    return encontrado;
}

int TTokenizer_crear(TTokenizer* tt){
    /* Inicializa la ultima frase procesada en vacia */
    strcpy(tt->ultimaFraseProcesada, STRING_VACIA);
    /* Crea la lista de terminos a omitir */
    lso_Crear(&tt->listaTerminosOmitir, sizeof(char)*MAX_DATO, &comparadorString);
    /* Se carga la lista de terminos a omitir */
    cargarListaTerminosOmitir(&tt->listaTerminosOmitir);
    /* Devuelve codigo de OK */
    return CODIGO_OK;
}

int TTokenizer_destruir(TTokenizer* tt){
    /* Actualmente no hay nada para liberar */
    /* Devuelve codigo de OK */
    return CODIGO_OK;
}

/* Pasa un String a lower case */
int stringAMinuscula(char* string){
    /* Contador de la posicion del String */
    int contador = 0;
    /* Mientras no se termina la cadena */
    while (string[contador]!=FIN_CADENA){
        /* Pasa el caracter a minuscula */
        string[contador]=tolower(string[contador]);
        /* Pasa a la siguiente posicion del contador */
        contador++;
    }
    /* Devuelve codigo de OK */
    return CODIGO_OK;
}

/* Arma lista con los terminos de una frase */
int armarListaTerminos(TTokenizer* tt, char* frase, TListaSimpleOrdenada* listaTerminos){
    /* Termino de una frase */
    char* termino;
    /* Contador de terminos */
    int contadorTermino = 0;
    /* Obtiene el primer termino */
    termino = strtok(frase, SEPARADOR_TERMINOS);
    /* Obtiene todos los terminos */
    while(termino!=NULL){
        /* Incrementa contador de termino */
        contadorTermino++;
        /* Pasa el termino a minuscula */
        stringAMinuscula(termino);
        /* Agrega el termino a la lista de terminos si hay que procesar dicho termino */
        if ( omitirTermino(tt, termino)!=CODIGO_OK ){
            lso_Insertar(listaTerminos, termino);
        }
        /* Obtiene siguiente termino */
        termino = strtok(NULL, SEPARADOR_TERMINOS);
    }
    /* Devuelve cantidad de argumentos obtenidos */
    return contadorTermino;
}

int TTokenizer_analizar(TTokenizer* tt, char* frase, TListaSimpleOrdenada *terminos){
    /* Almacena la frase en la ultima frase procesada */
    strcpy(tt->ultimaFraseProcesada, frase);
    /* Arma la lista de terminos */
    armarListaTerminos(tt, frase, terminos);
    /* Devuelve codigo de OK */
    return CODIGO_OK;
}
